/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estructurassa.expertos;

import estructurassa.entidades.CategoriaTrabajador;
import estructurassa.entidades.Material;
import estructurassa.expertos.excepciones.ABMCategoriaTrabajadorException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.Criteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import persistencia.Conexion;
import persistencia.Fachada;
import persistencia.exceptions.ExcepcionFachada;

/**
 *
 * @author Juan
 */
public class ExpertoABMCategoriaTrabajador implements Experto{


    public void guardar(CategoriaTrabajador categoriaTrabajador) throws ABMCategoriaTrabajadorException {
        validarCategoriaTrabajador(categoriaTrabajador);
        validarExistenciaCategoria(categoriaTrabajador);

        try {
            Conexion.getInstancia().iniciarTX();
            Fachada.getInstancia().guardar(categoriaTrabajador);
            Conexion.getInstancia().confirmarTx();
        } catch (ExcepcionFachada ex) {
            Conexion.getInstancia().deshacerTx();
            Logger.getLogger(ExpertoABMMaterial.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
    
    
    public List buscarCategorias(){
        return Fachada.getInstancia().buscar(CategoriaTrabajador.class, null);
    }
    
    //AGREGUE EL BUSCAR POR CODIGO TAMBIEn
    public List buscarCategorias(String nombre, String codigo){
        Criteria criterioNombre = Fachada.getInstancia().crearCriterio(CategoriaTrabajador.class);
        
        if(!"".equals(codigo)){
          criterioNombre.add(Restrictions.ilike("codigo", codigo));  
        }
        if(!"".equals(nombre)){
        criterioNombre.add(Restrictions.ilike("nombre", nombre, MatchMode.ANYWHERE));
        }
        return Fachada.getInstancia().buscar(Material.class, criterioNombre);
    }

    private void validarCategoriaTrabajador(CategoriaTrabajador categoriaTrabajador) throws ABMCategoriaTrabajadorException {
        if(categoriaTrabajador.getCodigo().length()==0){
            throw new ABMCategoriaTrabajadorException("Falta codigo");
        }
        if(categoriaTrabajador.getNombre().length()==0){
            throw new ABMCategoriaTrabajadorException("Falta nombre");
        }
        if(categoriaTrabajador.getRemuneracion() == null){
            throw new ABMCategoriaTrabajadorException("Falta remuneracion");
        }


    }

    private void validarExistenciaCategoria(CategoriaTrabajador categoria) throws ABMCategoriaTrabajadorException {
        Criteria codigoCategoria = Fachada.getInstancia().crearCriterio(Material.class);
        codigoCategoria.add(Restrictions.eq("codigo", categoria.getCodigo()).ignoreCase());
        if(!Fachada.getInstancia().buscar(Material.class, codigoCategoria).isEmpty()){
            throw new ABMCategoriaTrabajadorException("Categoria ya existente");
        }
    }
}
